package com.tea.zxql.controller;

import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.dev33.satoken.stp.StpUtil;
import cn.dev33.satoken.util.SaResult;
import com.tea.zxql.domain.dto.*;
import com.tea.zxql.domain.query.UserQuery;
import com.tea.zxql.domain.vo.UserInfoVO;
import com.tea.zxql.service.UserService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * @ClassDescription:
 * @ClassName: UserController
 * @JdkVersion: 17
 * @Author: HYC
 * @Created: 2025/7/17 14:59
 * @Version 1.0
 */

/**
 * 系统用户管理控制器，提供用户登录、登出、信息查询、增删改查等操作接口。
 */
@Tag(name = "后台用户管理")
@RestController
@RequestMapping("/user")
public class SysUserController {


    private static final Logger log = LoggerFactory.getLogger(SysUserController.class);
    @Autowired
    private UserService userService;


    /**
     * 用户登录接口，接收用户名和密码进行认证并返回token。
     *
     * @param logInDTO 登录信息数据传输对象，包含用户名和密码
     * @return 返回包含token的SaResult对象
     */
    @Operation(summary = "用户登录")
    @PostMapping("/login")
    public SaResult login(@RequestBody LoginDTO logInDTO) {

        String token = userService.login(logInDTO);

        return SaResult.data(token);
    }

    /**
     * 用户退出登录接口，清除当前用户的登录状态。
     *
     * @return 返回退出成功的提示信息
     */
    @Operation(summary = "用户退出登录")
    @PostMapping("/logout")
    public SaResult logout() {
        log.info("用户退出登录！");
        StpUtil.logout();
        return SaResult.ok("退出成功");
    }


    /**
     * 获取当前登录用户的基本信息。
     *
     * @return 返回包含用户信息的SaResult对象
     */
    @Operation(summary = "获取当前登录用户信息")
    @GetMapping("/getUserInfo")
    public SaResult getUserInfo() {

        Integer loginId = StpUtil.getLoginIdAsInt();
        UserInfoVO userInfoVO = userService.getUserInfo(loginId);
        return SaResult.data(userInfoVO);
    }

    /**
     * 分页获取用户列表信息，需要系统用户查询权限。
     *
     * @param query 用户查询条件封装对象
     * @return 返回分页后的用户信息列表
     */
    @Operation(summary = "分页获取用户列表")
    @GetMapping("/getPage")
    @SaCheckPermission("system.user.query")
    public SaResult getList(@ModelAttribute UserQuery query) {
        log.info("query: {}", query);
        log.info("获取用户列表！");
        PageDTO<UserInfoVO> page = userService.getListPage(query);


        return SaResult.data(page);
    }


    /**
     * 新增用户信息，需要系统用户添加权限。
     *
     * @param userDTO 用户信息数据传输对象
     * @return 返回操作结果
     */
    @Operation(summary = "新增用户")
    @PostMapping("/add")
    @SaCheckPermission("system.user.add")
    public SaResult add(@RequestBody UserDTO userDTO) {

        userService.addUser(userDTO);

        return SaResult.ok();
    }


    /**
     * 根据用户ID删除用户信息，需要系统用户删除权限。
     *
     * @param id 用户ID
     * @return 返回操作结果
     */
    @Operation(summary = "删除用户")
    @DeleteMapping("/delete/{id}")
    @SaCheckPermission("system.user.delete")
    public SaResult deleteById(@PathVariable Integer id) {

        userService.delById(id);

        return SaResult.ok();
    }

    /**
     * 更新用户信息，需要系统用户更新权限。
     *
     * @param userDTO 用户信息数据传输对象
     * @return 返回操作结果
     */
    // 更新操作
    @Operation(summary = "更新用户")
    @PutMapping("/update")
    @SaCheckPermission("system.user.update")
    public SaResult update(@RequestBody UserDTO userDTO) {

        userService.updateUser(userDTO);

        return SaResult.ok();
    }



    /**
     * 获取公司列表信息，需要获取公司信息权限。
     *
     * @return 返回公司名称列表
     */
    @Operation(summary = "获取公司列表")
    @GetMapping("/getCompany")
    @SaCheckPermission("system.user.getCompany")
    public SaResult getCompany() {

        List<String> companyList =userService.getCompanyList();

        return SaResult.data(companyList);
    }




    /**
     * 批量新增用户信息，需要批量添加用户权限。
     *
     * @param addUserListDTO 批量用户信息数据传输对象
     * @return 返回操作结果
     */
    // 批量增加用户
    @Operation(summary = "批量新增用户")
    @PostMapping("/addUserList")
    @SaCheckPermission("system.user.addUserList")
    public SaResult addUserList(@RequestBody AddUserListDTO addUserListDTO) {

        userService.addUserList(addUserListDTO);

        return SaResult.ok();
    }



    /**
     * 更新当前用户密码。
     *
     * @param updatePasswordDTO 密码更新信息数据传输对象
     * @return 返回操作结果
     */
    @Operation(summary = "更新当前用户密码")
    @PutMapping("/updatePassword")
    public SaResult updatePassword(@RequestBody UpdatePasswordDTO updatePasswordDTO) {


        userService.updatePassword(updatePasswordDTO);
        

        return SaResult.ok();
    }




}
